"""
数据库优化模块使用示例

本文件展示了如何使用数据库优化模块的API接口进行数据库优化操作。
包括基本用法、自定义配置、进度回调等功能的示例代码。
"""

import sqlite3
from typing import Optional
from database_optimization import DatabaseOptimizer, OptimizerConfig
from database_optimization.utils import create_backup_before_optimization, format_size
from logger_module import log_info, log_warning, log_error


def basic_optimization_example():
    """
    基本优化示例 - 使用默认配置和自动连接管理
    """
    log_info("===== 基本数据库优化示例 =====")
    
    try:
        # 创建优化器实例（使用默认配置）
        optimizer = DatabaseOptimizer()
        
        # 执行优化（会自动获取数据库连接）
        result = optimizer.optimize()
        
        # 输出优化结果
        log_info("优化完成，结果如下:")
        log_info(str(result))
        
    except Exception as e:
        log_error(f"优化过程中发生错误: {str(e)}")


def custom_config_example():
    """
    自定义配置示例 - 设置特定的优化选项
    """
    log_info("\n===== 自定义配置优化示例 =====")
    
    try:
        # 创建自定义配置
        custom_config = OptimizerConfig({
            'options': {
                'enable_vacuum': True,      # 启用VACUUM
                'enable_reindex': True,     # 启用索引重建
                'enable_cleanup': False,    # 禁用数据清理
                'enable_analyze': True,     # 启用统计分析
                'exclude_system_tables': True  # 排除系统表
            },
            'step_weights': {
                'vacuum': 40,    # VACUUM权重增加到40%
                'reindex': 30,   # 索引重建权重减少到30%
                'analyze': 30    # 统计分析权重增加到30%
            }
        })
        
        # 使用自定义配置创建优化器
        optimizer = DatabaseOptimizer(custom_config)
        
        # 执行优化
        result = optimizer.optimize()
        
        # 输出详细结果
        log_info("使用自定义配置优化完成:")
        log_info(f"- 成功状态: {'√' if result.success else '×'}")
        log_info(f"- 执行时间: {result.get_duration():.2f}秒")
        log_info(f"- 完成步骤: {', '.join(result.steps_completed)}")
        log_info(f"- 优化表数: {result.tables_optimized}")
        
    except Exception as e:
        log_error(f"优化过程中发生错误: {str(e)}")


def external_connection_example(db_path: str):
    """
    使用外部数据库连接示例
    
    Args:
        db_path: 数据库文件路径
    """
    log_info("\n===== 使用外部连接优化示例 =====")
    
    conn = None
    try:
        # 创建外部连接
        conn = sqlite3.connect(db_path)
        
        # 使用外部连接创建优化器
        optimizer = DatabaseOptimizer()
        
        # 执行优化
        result = optimizer.optimize(connection=conn)
        
        log_info("使用外部连接优化完成:")
        log_info(str(result))
        
    except Exception as e:
        log_error(f"优化过程中发生错误: {str(e)}")
    finally:
        # 关闭外部连接
        if conn:
            conn.close()


def progress_callback_example():
    """
    带进度回调的优化示例
    """
    log_info("\n===== 带进度回调的优化示例 =====")
    
    def progress_handler(progress: int, message: str):
        """进度回调函数"""
        if progress >= 0:
            log_info(f"[{progress}%] {message}")
        else:
            log_error(f"[错误] {message}")
    
    try:
        # 创建优化器
        optimizer = DatabaseOptimizer()
        
        # 执行带进度回调的优化
        result = optimizer.optimize(progress_callback=progress_handler)
        
        log_info("\n优化完成:")
        log_info(f"成功: {'是' if result.success else '否'}")
        
    except Exception as e:
        log_error(f"优化过程中发生错误: {str(e)}")


def backup_before_optimization_example(db_path: str):
    """
    优化前备份示例
    
    Args:
        db_path: 数据库文件路径
    """
    log_info("\n===== 优化前备份示例 =====")
    
    conn = None
    try:
        # 创建连接
        conn = sqlite3.connect(db_path)
        
        # 创建优化前备份
        log_info("正在创建优化前备份...")
        backup_path = create_backup_before_optimization(conn)
        
        if backup_path:
            log_info(f"备份创建成功: {backup_path}")
            
            # 执行优化
            optimizer = DatabaseOptimizer()
            result = optimizer.optimize(connection=conn)
            
            log_info("优化完成:")
            log_info(str(result))
        else:
            log_warning("备份创建失败，取消优化操作")
            
    except Exception as e:
        log_error(f"操作过程中发生错误: {str(e)}")
    finally:
        # 关闭连接
        if conn:
            conn.close()


def main():
    """
    主函数，运行所有示例
    """
    log_info("数据库优化模块使用示例\n")
    
    # 数据库文件路径（根据实际情况修改）
    # 注意：如果留空，将尝试使用默认连接
    db_path = ""
    
    # 运行不同的示例
    basic_optimization_example()
    custom_config_example()
    progress_callback_example()
    
    if db_path:
        external_connection_example(db_path)
        backup_before_optimization_example(db_path)
    else:
        log_info("\n提示: 要运行外部连接和备份示例，请设置db_path变量")
    
    log_info("\n所有示例运行完毕!")


if __name__ == "__main__":
    main()